﻿using System;
using EditMode;

namespace ScriptUtilities
{
    public class Performer
    {
        public int Id { get; set; } = 0;

        public bool Exclude { get; set; }

        public bool Fixed { get; set; }

        public CustomizeItem Back { get; set; } = CustomizeItem.なし;

        public CustomizeItem Face { get; set; } = CustomizeItem.なし;

        public CustomizeItem Neck { get; set; } = CustomizeItem.なし;

        public CustomizeItem Zujo { get; set; } = CustomizeItem.なし;

        public Character Chara { get; set; } = Character.MIK;

        public Module PvCostume { get; set; } = Module.初音ミク_オリジナル;

        public Size CharaSize { get; set; } = Size.NORMAL;

        public CharaType Type { get; set; } = CharaType.VOCAL;

        public static Character GetCharacter(Module module)
        {
            switch (module)
            {
                case Module.初音ミク_オリジナル:
                    return Character.MIK;
                case Module.初音ミク_アペンド:
                    return Character.MIK;
                case Module.初音ミク_翠玉:
                    return Character.MIK;
                case Module.おさんぽスタイル:
                    return Character.MIK;
                case Module.初音ミク_蝶:
                    return Character.MIK;
                case Module.ハートハンター:
                    return Character.MIK;
                case Module.コンフリクト:
                    return Character.MIK;
                case Module.ホワイトドレス:
                    return Character.MIK;
                case Module.ヴィンテージドレス:
                    return Character.MIK;
                case Module.カラフルドロップ:
                    return Character.MIK;
                case Module.スクール:
                    return Character.MIK;
                case Module.オービット:
                    return Character.MIK;
                case Module.ゴシック:
                    return Character.MIK;
                case Module.ソリチュード:
                    return Character.MIK;
                case Module.ナチュラル:
                    return Character.MIK;
                case Module.ラセツトムクロ:
                    return Character.MIK;
                case Module.無限:
                    return Character.MIK;
                case Module.ノーブル:
                    return Character.MIK;
                case Module.初音ミク_V3:
                    return Character.MIK;
                case Module.シュープリーム:
                    return Character.MIK;
                case Module.メテオライト:
                    return Character.MIK;
                case Module.ディメンション:
                    return Character.MIK;
                case Module.シャノワール:
                    return Character.MIK;
                case Module.花詞:
                    return Character.MIK;
                case Module.ホーリーゴッデス:
                    return Character.MIK;
                case Module.華車:
                    return Character.MIK;
                case Module.リグレット:
                    return Character.MIK;
                case Module.マリオネット_AS:
                    return Character.MIK;
                case Module.サイレン:
                    return Character.MIK;
                case Module.月光アゲハ:
                    return Character.MIK;
                case Module.アバンガード:
                    return Character.MIK;
                case Module.ライアー:
                    return Character.MIK;
                case Module.ストリートポップ:
                    return Character.MIK;
                case Module.ローザ_ビアンカ:
                    return Character.MIK;
                case Module.ブレス_ユー:
                    return Character.MIK;
                case Module.フォニュエールスタイル:
                    return Character.MIK;
                case Module.ナナイロライン:
                    return Character.MIK;
                case Module.オレンジブロッサム:
                    return Character.MIK;
                case Module.マジカルミライ:
                    return Character.MIK;
                case Module.ローザ_ビアンカ_AS:
                    return Character.MIK;
                case Module.マリオネット:
                    return Character.MIK;
                case Module.ゆるふわパステル:
                    return Character.MIK;
                case Module.シャノワール_AS:
                    return Character.MIK;
                case Module.リアクター:
                    return Character.RIN;
                case Module.鏡音リン_蘇芳:
                    return Character.RIN;
                case Module.鏡音リン_蘇芳_妖狐:
                    return Character.RIN;
                case Module.ねこねこケープ:
                    return Character.MIK;
                case Module.チアフルキャンディ:
                    return Character.RIN;
                case Module.陽炎:
                    return Character.RIN;
                case Module.夢見るパンダ:
                    return Character.RIN;
                case Module.ヒマワリ:
                    return Character.RIN;
                case Module.フェイカー:
                    return Character.RIN;
                case Module.ソレイユ:
                    return Character.RIN;
                case Module.フェアリーワンピース:
                    return Character.RIN;
                case Module.パンキッシュ:
                    return Character.LEN;
                case Module.鏡音レン_藍鉄:
                    return Character.LEN;
                case Module.鏡音レン_藍鉄_妖狐:
                    return Character.LEN;
                case Module.アジテーション:
                    return Character.MIK;
                case Module.スクールジャージ:
                    return Character.LEN;
                case Module.ストレンジダーク:
                    return Character.LEN;
                case Module.恋するシロクマ:
                    return Character.LEN;
                case Module.イレイザー:
                    return Character.LEN;
                case Module.アヤサキ:
                    return Character.LEN;
                case Module.シエル:
                    return Character.LEN;
                case Module.ホワイトエッジ:
                    return Character.LEN;
                case Module.巡音ルカ_華:
                    return Character.LUK;
                case Module.フロイライン:
                    return Character.LUK;
                case Module.魔女っ娘Style:
                    return Character.LUK;
                case Module.スターヴォイス:
                    return Character.MIK;
                case Module.サイバーネイション:
                    return Character.LUK;
                case Module.ハードロック:
                    return Character.LUK;
                case Module.VFスーツ:
                    return Character.LUK;
                case Module.リクルーター:
                    return Character.LUK;
                case Module.サクセサー:
                    return Character.LUK;
                case Module.テンプテーション:
                    return Character.LUK;
                case Module.フローラル:
                    return Character.LUK;
                case Module.ネコサイバー:
                    return Character.KAI;
                case Module.時雨:
                    return Character.KAI;
                case Module.スミレ:
                    return Character.KAI;
                case Module.ハートビート:
                    return Character.MIK;
                case Module.ホワイトブレザー:
                    return Character.KAI;
                case Module.KAITO_V3:
                    return Character.KAI;
                case Module.オリジネイター:
                    return Character.KAI;
                case Module.ローザ_ブルー:
                    return Character.KAI;
                case Module.ローザ_ブルー_AS:
                    return Character.KAI;
                case Module.ホリデイ:
                    return Character.KAI;
                case Module.ふわふわコート:
                    return Character.MEI;
                case Module.紅葉:
                    return Character.MEI;
                case Module.スカーレット:
                    return Character.MEI;
                case Module.ローレライ:
                    return Character.MEI;
                case Module.パンジー:
                    return Character.MIK;
                case Module.大正浪漫:
                    return Character.MEI;
                case Module.ブレイジング:
                    return Character.MEI;
                case Module.マリーン_リボン:
                    return Character.MEI;
                case Module.テンプテーション_AS:
                    return Character.LUK;
                case Module.レーシングミク_2012_Ver:
                    return Character.MIK;
                case Module.ディープスカイ:
                    return Character.MIK;
                case Module.わがまま工場長:
                    return Character.MIK;
                case Module.Hello_Good_night:
                    return Character.MIK;
                case Module.初音ミク_SW_みずたまビキニ:
                    return Character.MIK;
                case Module.初音ミク_SW_スクール競泳:
                    return Character.MIK;
                case Module.初音ミク_浴衣スタイル:
                    return Character.MIK;
                case Module.らんみんぐ:
                    return Character.MIK;
                case Module.リボンガール:
                    return Character.MIK;
                case Module.鏡音リン_オリジナル:
                    return Character.RIN;
                case Module.鏡音リン_アペンド:
                    return Character.RIN;
                case Module.メランコリー:
                    return Character.RIN;
                case Module.紫揚羽:
                    return Character.MIK;
                case Module.トランスミッター:
                    return Character.RIN;
                case Module.鏡音リン_桜月:
                    return Character.RIN;
                case Module.鏡音リン_雨:
                    return Character.RIN;
                case Module.鏡音リン_SW_しましまビキニ:
                    return Character.RIN;
                case Module.鏡音リン_SW_スクール:
                    return Character.RIN;
                case Module.鏡音リン_浴衣スタイル:
                    return Character.RIN;
                case Module.魔導師のタマゴ:
                    return Character.RIN;
                case Module.スタイリッシュエナジーR:
                    return Character.RIN;
                case Module.トラッドスクール:
                    return Character.RIN;
                case Module.鏡音レン_オリジナル:
                    return Character.LEN;
                case Module.メモリア:
                    return Character.MIK;
                case Module.鏡音レン_アペンド:
                    return Character.LEN;
                case Module.スターマイン:
                    return Character.LEN;
                case Module.レシーバー:
                    return Character.LEN;
                case Module.鏡音レン_鳳月:
                    return Character.LEN;
                case Module.鏡音レン_鶴:
                    return Character.LEN;
                case Module.バッドボーイ:
                    return Character.LEN;
                case Module.鏡音レン_SW_ボクサー:
                    return Character.LEN;
                case Module.鏡音レン_浴衣スタイル:
                    return Character.LEN;
                case Module.スタイリッシュエナジーL:
                    return Character.LEN;
                case Module.生徒会執行部:
                    return Character.LEN;
                case Module.理系少女:
                    return Character.MIK;
                case Module.BBオペレーター:
                    return Character.MEI;
                case Module.巡音ルカ_オリジナル:
                    return Character.LUK;
                case Module.ゆるふわコーデ:
                    return Character.LUK;
                case Module.エターナルホワイト:
                    return Character.LUK;
                case Module.アムール:
                    return Character.LUK;
                case Module.巡音ルカ_紅玉:
                    return Character.LUK;
                case Module.巡音ルカ_SW_リゾートビキニ:
                    return Character.LUK;
                case Module.巡音ルカ_SW_競泳タイプ:
                    return Character.LUK;
                case Module.巡音ルカ_浴衣スタイル:
                    return Character.LUK;
                case Module.森の妖精姫:
                    return Character.LUK;
                case Module.ピエレッタ:
                    return Character.MIK;
                case Module.クイン_ビー:
                    return Character.LUK;
                case Module.放課後モード:
                    return Character.LUK;
                case Module.KAITO_オリジナル:
                    return Character.KAI;
                case Module.レクイエム:
                    return Character.KAI;
                case Module.ギルティ:
                    return Character.KAI;
                case Module.ジェネラル:
                    return Character.KAI;
                case Module.KAITO_SW_ハーフスパッツ:
                    return Character.KAI;
                case Module.KAITO_浴衣スタイル:
                    return Character.KAI;
                case Module.ジーニアス:
                    return Character.KAI;
                case Module.学ラン_パーカー:
                    return Character.KAI;
                case Module.イノセント:
                    return Character.MIK;
                case Module.MEIKOギルティオリジナル:
                    return Character.MEI;
                case Module.ブルークリスタル:
                    return Character.MEI;
                case Module.ノエル_ルージュ:
                    return Character.MEI;
                case Module.MEIKO_SW_ロングパレオ:
                    return Character.MEI;
                case Module.MEIKO_SW_ウォーターポロ:
                    return Character.MEI;
                case Module.MEIKO_浴衣スタイル:
                    return Character.MEI;
                case Module.ホイッスル:
                    return Character.MEI;
                case Module.グラデュエート:
                    return Character.MEI;
                case Module.咲音メイコ_オリジナル:
                    return Character.MEI;
                case Module.バッドボーイ_AS:
                    return Character.LEN;
                case Module.堕悪天使:
                    return Character.MIK;
                case Module.ジェネラル_AS:
                    return Character.KAI;
                case Module.壱ノ桜_桜花:
                    return Character.MIK;
                case Module.弐ノ桜_胡蝶:
                    return Character.RIN;
                case Module.弐ノ桜_扇舞:
                    return Character.LEN;
                case Module.参ノ桜_楓香:
                    return Character.LUK;
                case Module.零ノ桜_紅椿:
                    return Character.MEI;
                case Module.零ノ桜_蒼雪:
                    return Character.KAI;
                case Module.リンケージ:
                    return Character.MIK;
                case Module.シザーズ:
                    return Character.RIN;
                case Module.トリッカー:
                    return Character.LEN;
                case Module.サマーメモリー:
                    return Character.MIK;
                case Module.リンちゃん愛し隊１号:
                    return Character.MIK;
                case Module.弐ノ桜_胡蝶_AS:
                    return Character.RIN;
                case Module.リンちゃん愛し隊２号:
                    return Character.LUK;
                case Module.ハニーウィップ:
                    return Character.MIK;
                case Module.雪ミク_2013:
                    return Character.MIK;
                case Module.雪ミク_2013_AS:
                    return Character.MIK;
                case Module.鏡音リン_Future_Style:
                    return Character.RIN;
                case Module.にゃんこ:
                    return Character.MIK;
                case Module.マジシャン:
                    return Character.MIK;
                case Module.みくずきん:
                    return Character.MIK;
                case Module.なし:
                    throw new InvalidOperationException($"Module type {module} does not contain a character definition.");
                default:
                    return Character.EXTRA;
            }
        }

        public enum Character : short
        {
            MIKU,
            MIK,
            RIN,
            LEN,
            LUKA,
            LUK,
            NERU,
            NER,
            HAKU,
            HAK,
            KAITO,
            KAI,
            MEIKO,
            MEI,
            SAKINE,
            SAK,
            TETO,
            TET,
            EXTRA,
            EXT,
        }

        public enum CharaType : short
        {
            GUEST,
            PSEUDO_DEFAULT,
            PSEUDO_MYCHARA,
            PSEUDO_SAME,
            PSEUDO_SWIM,
            PSEUDO_SWIM_S,
            VOCAL,
        }

        public enum Size : short
        {
            NORMAL,
            PLAY_CHARA,
            PV_CHARA,
            SHORT,
            TALL,
        }
    }
}
